/**
 * 加密相关类型定义
 * 
 * @author RickPan Team
 * @version 1.0
 * @since 2025-07-19
 */

/**
 * 加密消息接口
 */
export interface EncryptedMessage {
  /** 加密后的内容（Base64格式） */
  ciphertext: string
  /** 初始化向量（Base64格式） */
  iv: string
  /** 加密算法 */
  algorithm: string
}

/**
 * 解密后的消息接口
 */
export interface DecryptedMessage {
  /** 解密后的内容 */
  content: string
  /** 解密后的文件名（可选） */
  fileName?: string
}

/**
 * 团队密钥信息接口
 */
export interface TeamKeyInfo {
  /** 团队密钥（Base64格式） */
  teamKey: string
  /** 加密算法 */
  algorithm: string
  /** 密钥长度（位） */
  keyLength: number
  /** 获取时间戳 */
  fetchedAt: number
  /** 过期时间戳（可选） */
  expiresAt?: number
}

/**
 * 密钥缓存条目接口
 */
export interface KeyCacheEntry {
  /** 密钥信息 */
  keyInfo: TeamKeyInfo
  /** 最后使用时间 */
  lastUsed: number
  /** 命中次数 */
  hitCount: number
}

/**
 * 加密状态枚举
 */
export enum EncryptionStatus {
  /** 未加密 */
  NONE = 'none',
  /** 加密中 */
  ENCRYPTING = 'encrypting',
  /** 已加密 */
  ENCRYPTED = 'encrypted',
  /** 解密中 */
  DECRYPTING = 'decrypting',
  /** 解密完成 */
  DECRYPTED = 'decrypted',
  /** 加密失败 */
  ENCRYPT_FAILED = 'encrypt_failed',
  /** 解密失败 */
  DECRYPT_FAILED = 'decrypt_failed'
}

/**
 * 团队消息加密扩展接口
 */
export interface TeamMessageEncryption {
  /** 初始化向量 */
  iv?: string
  /** 加密算法 */
  encryptionAlgorithm?: string
  /** 密钥版本 */
  keyVersion?: number
  /** 是否加密 */
  isEncrypted?: boolean
  /** 加密状态 */
  encryptionStatus?: EncryptionStatus
}

/**
 * 扩展的团队消息接口
 */
export interface EncryptedTeamMessage extends TeamMessageEncryption {
  id?: number
  teamId: number
  senderId: number
  senderName?: string
  senderAvatar?: string
  messageType: 'text' | 'image' | 'file'
  /** 消息内容（可能是密文） */
  content: string
  /** 文件名（可能是密文） */
  fileName?: string
  fileSize?: number
  fileUrl?: string
  messageStatus: 'sending' | 'sent' | 'failed'
  timestamp: number
  replyToId?: number
}

/**
 * 消息发送请求接口
 */
export interface SendMessageRequest {
  teamId: number
  messageType: 'text' | 'image' | 'file'
  /** 原始内容（明文） */
  originalContent?: string
  /** 加密后的内容 */
  content: string
  /** 原始文件名（明文） */
  originalFileName?: string
  /** 加密后的文件名 */
  fileName?: string
  fileSize?: number
  fileUrl?: string
  iv: string
  encryptionAlgorithm: string
  keyVersion: number
  isEncrypted: boolean
  replyToId?: number
}

/**
 * 加密性能测试结果接口
 */
export interface EncryptionPerformanceResult {
  /** 总加密时间（毫秒） */
  encryptTime: number
  /** 总解密时间（毫秒） */
  decryptTime: number
  /** 平均加密时间（毫秒） */
  avgEncryptTime: number
  /** 平均解密时间（毫秒） */
  avgDecryptTime: number
  /** 测试迭代次数 */
  iterations: number
  /** 测试数据大小（字节） */
  dataSize: number
}

/**
 * 加密服务健康状态接口
 */
export interface EncryptionHealthStatus {
  /** 是否健康 */
  healthy: boolean
  /** 加密算法 */
  algorithm: string
  /** 检查时间戳 */
  checkTime: number
  /** 错误信息（如果有） */
  error?: string
}

/**
 * 密钥缓存统计接口
 */
export interface KeyCacheStats {
  /** 当前缓存大小 */
  size: number
  /** 最大缓存大小 */
  maxSize: number
  /** 缓存TTL（毫秒） */
  cacheTTL: number
  /** 缓存条目详情 */
  entries: Array<{
    teamId: number
    algorithm: string
    fetchedAt: number
    lastUsed: number
    hitCount: number
    age: number
  }>
}

/**
 * 加密错误类型枚举
 */
export enum EncryptionErrorType {
  /** 浏览器不支持 */
  BROWSER_NOT_SUPPORTED = 'browser_not_supported',
  /** 密钥无效 */
  INVALID_KEY = 'invalid_key',
  /** 数据无效 */
  INVALID_DATA = 'invalid_data',
  /** 网络错误 */
  NETWORK_ERROR = 'network_error',
  /** 服务器错误 */
  SERVER_ERROR = 'server_error',
  /** 权限不足 */
  PERMISSION_DENIED = 'permission_denied',
  /** 加密失败 */
  ENCRYPTION_FAILED = 'encryption_failed',
  /** 解密失败 */
  DECRYPTION_FAILED = 'decryption_failed',
  /** 密钥获取失败 */
  KEY_FETCH_FAILED = 'key_fetch_failed',
  /** 缓存错误 */
  CACHE_ERROR = 'cache_error'
}

/**
 * 加密错误接口
 */
export interface EncryptionError extends Error {
  /** 错误类型 */
  type: EncryptionErrorType
  /** 团队ID（如果相关） */
  teamId?: number
  /** 原始错误 */
  originalError?: Error
  /** 错误时间戳 */
  timestamp: number
}

/**
 * 加密配置接口
 */
export interface EncryptionConfig {
  /** 是否启用加密 */
  enabled: boolean
  /** 加密算法 */
  algorithm: string
  /** 密钥长度 */
  keyLength: number
  /** IV长度 */
  ivLength: number
  /** 标签长度 */
  tagLength: number
  /** 缓存TTL */
  cacheTTL: number
  /** 最大缓存大小 */
  maxCacheSize: number
  /** 是否自动预加载密钥 */
  autoPreloadKeys: boolean
  /** 性能监控 */
  performanceMonitoring: boolean
}

/**
 * 批量加密请求接口
 */
export interface BatchEncryptRequest {
  teamId: number
  items: Array<{
    id: string
    content?: string
    fileName?: string
  }>
}

/**
 * 批量加密响应接口
 */
export interface BatchEncryptResponse {
  teamId: number
  results: Array<{
    id: string
    success: boolean
    encryptedContent?: EncryptedMessage
    encryptedFileName?: EncryptedMessage
    error?: string
  }>
}

/**
 * 批量解密请求接口
 */
export interface BatchDecryptRequest {
  teamId: number
  items: Array<{
    id: string
    encryptedContent?: EncryptedMessage
    encryptedFileName?: EncryptedMessage
  }>
}

/**
 * 批量解密响应接口
 */
export interface BatchDecryptResponse {
  teamId: number
  results: Array<{
    id: string
    success: boolean
    content?: string
    fileName?: string
    error?: string
  }>
}
